//单例模式（懒汉模式）
//在instance为空的时候，才去创建实例
//懒汉模式的单例模式是线程不安全的，需要加锁
//还会涉及到指令重排序的问题，需要加上volatile
class Singleton2{
    private static volatile Singleton2 instance=null;
    //因为是在static这样的静态方法里面加锁，所以锁对象也必须被static修饰
    private static Object obj=new Object();
    public static Singleton2 getInstance(){
        //此处的if语句是判断需不需要加锁
        if (instance==null){
            synchronized (obj){
                //此处的if语句是判断需不需要实例化类的对象
                if (instance==null){
                    instance=new Singleton2();
                }
            }
        }
        return instance;
    }
    private Singleton2(){

    }
}
public class Demo23 {
    public static  void main(String[] args) {
         //构造方法被设置为私有的，无法通过new 操作去获取类的实例
        //Singleton2 s=new Singleton2();
        //只能通过类名.getInstance()去获取类的实例，从而保证类只有一个实例（保证了单例模式）
        Singleton2 S1=Singleton2.getInstance();
        Singleton2 S2=Singleton2.getInstance();
        System.out.println(S1==S2);
    }
}
